package com.ruoyi.system.service.impl;

import java.math.BigDecimal;
import java.util.List;

import com.ruoyi.common.core.domain.entity.SysUser;
import lombok.RequiredArgsConstructor;
import org.apache.commons.lang3.RandomStringUtils;
import org.springframework.dao.DuplicateKeyException;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import com.ruoyi.common.utils.DateUtils;
import com.ruoyi.system.mapper.SysFeeMapper;
import com.ruoyi.system.domain.SysFee;
import com.ruoyi.system.service.ISysFeeService;
import com.ruoyi.system.service.ISysUserService;

/**
 * 费用管理Service业务层处理
 * 
 * @author ruoyi
 */
@Service
@RequiredArgsConstructor
public class SysFeeServiceImpl implements ISysFeeService 
{

    private final SysFeeMapper sysFeeMapper;


    private final ISysUserService userService;

    /**
     * 查询费用管理
     * 
     * @param feeId 费用管理主键
     * @return 费用管理
     */
    @Override
    public SysFee selectSysFeeByFeeId(Long feeId)
    {
        return sysFeeMapper.selectSysFeeByFeeId(feeId);
    }

    /**
     * 查询费用管理列表
     * 
     * @param sysFee 费用管理
     * @return 费用管理
     */
    @Override
    public List<SysFee> selectSysFeeList(SysFee sysFee)
    {
        return sysFeeMapper.selectSysFeeList(sysFee);
    }

    /**
     * 新增费用管理
     * 
     * @param sysFee 费用管理
     * @return 结果
     */
    @Override
    @Transactional(rollbackFor = {Exception.class, DuplicateKeyException.class})
    public int insertSysFee(SysFee sysFee)
    {
        // 入住费用金额不能为0 或者负数
        if (sysFee.getAmount() == null || sysFee.getAmount().compareTo(BigDecimal.ZERO) <= 0){
            throw new RuntimeException("入住费用金额不能为0 或者负数");
        }
        // 获取老人用户ID
        Long elderUserId = sysFee.getElderUserId();
        SysUser user = userService.selectUserById(elderUserId);
        String delFlag = "0";
        if (user == null || !delFlag.equals(user.getDelFlag())){
            throw new RuntimeException("未找到老人用户信息");
        }
        // 老人用户余额增加入住费用金额
        // 如果状态为已支付 则在用户表中加余额
        String alreadyPaymentStatus = "1";
        if (alreadyPaymentStatus.equals(sysFee.getPaymentStatus())) {
            BigDecimal balance = user.getBalance() == null ? BigDecimal.ZERO : user.getBalance();
            user.setBalance(balance.add(sysFee.getAmount()));
            userService.updateUser(user);
        }
        sysFee.setMonth(DateUtils.parseDateToStr("yyyy-MM", DateUtils.getNowDate()));
        sysFee.setBillNo(DateUtils.dateTimeNow() + RandomStringUtils.randomNumeric(6));
        return sysFeeMapper.insertSysFee(sysFee);
    }

    /**
     * 修改费用管理
     * 
     * @param sysFee 费用管理
     * @return 结果
     */
    @Override
    public int updateSysFee(SysFee sysFee)
    {
        // 入住费用金额不能为0 或者负数
        if (sysFee.getAmount() == null || sysFee.getAmount().compareTo(BigDecimal.ZERO) <= 0){
            throw new RuntimeException("入住费用金额不能为0 或者负数");
        }
        // 获取原先的费用金额
        SysFee sysFeeOld = sysFeeMapper.selectSysFeeByFeeId(sysFee.getFeeId());
        BigDecimal oldAmount = sysFeeOld.getAmount();
        // 现在的费用金额
        BigDecimal nowAmount = sysFee.getAmount();
        // 如果原先的费用金额和现在的费用金额相同 则不需要更新用户余额
        if (sysFee.getAmount().compareTo(oldAmount) != 0) {
            //需要更新的用户金额
            BigDecimal updateAmount = nowAmount.subtract(oldAmount);
            // 获取老人用户ID
            Long elderUserId = sysFee.getElderUserId();
            SysUser user = userService.selectUserById(elderUserId);
            // 更新用户余额
            user.setBalance(user.getBalance().add(updateAmount));
            userService.updateUser(user);
        }
        return sysFeeMapper.updateSysFee(sysFee);
    }

    /**
     * 批量删除费用管理
     * 
     * @param feeIds 需要删除的费用管理主键
     * @return 结果
     */
    @Override
    public int deleteSysFeeByFeeIds(Long[] feeIds)
    {
        return sysFeeMapper.deleteSysFeeByFeeIds(feeIds);
    }

    /**
     * 删除费用管理信息
     * 
     * @param feeId 费用管理主键
     * @return 结果
     */
    @Override
    public int deleteSysFeeByFeeId(Long feeId)
    {
        return sysFeeMapper.deleteSysFeeByFeeId(feeId);
    }

    /**
     * 处理入住费用
     * 
     * @param elderUserId 老人用户ID
     * @param amount 入住费用金额
     * @return 结果
     */
    @Override
    @Transactional(rollbackFor = {Exception.class, DuplicateKeyException.class})
    public int handleCheckInFee(Long elderUserId, BigDecimal amount,String type)
    {
        // 1. 创建费用记录
        SysFee fee = new SysFee();
        fee.setElderUserId(elderUserId);
        // 住宿费
        fee.setFeeType(type);
        fee.setAmount(amount.negate());
        // 未支付
        fee.setPaymentStatus("0");
        fee.setMonth(DateUtils.parseDateToStr("yyyy-MM", DateUtils.getNowDate()));
        fee.setBillNo(DateUtils.dateTimeNow() + RandomStringUtils.randomNumeric(6));

        // 2. 从用户余额中扣除费用
        if (userService.selectUserById(elderUserId).getBalance().compareTo(amount) >= 0) {
            // 余额充足，自动扣费
            // 已支付
            fee.setPaymentStatus("1");
            fee.setPaymentTime(DateUtils.getNowDate());
            // 余额支付
            fee.setPaymentMethod("0");

            // 更新用户余额
            userService.recharge(elderUserId, amount.negate());
        }

        return sysFeeMapper.insertSysFee(fee);
    }
} 